package exemplares;

import locacoes.IteratorLocacoesArray;

public class RepositorioExemplaresLista implements RepositorioExemplares{

	private Exemplar exemplares;

	private RepositorioExemplaresLista proximo;

	public RepositorioExemplaresLista() {
		exemplares = null;
		proximo = null;
	}

	public void inserir(Exemplar exemplar) {
		if (this.exemplares != null) {
			proximo.inserir(exemplar);
		} else {
			this.exemplares = exemplar;
			this.proximo = new RepositorioExemplaresLista();
		}
	}

	public void atualizar(Exemplar exemplar) throws ExemplarNaoEncontradoException {
		if (this.exemplares != null) {
			if (this.exemplares.getCodigo() == exemplar.getCodigo()) {
				this.exemplares = exemplar;
			} else {
				proximo.atualizar(exemplar);
			}
		} else {
			throw new ExemplarNaoEncontradoException();
		}
	}

	public void remover(int numero) throws ExemplarNaoEncontradoException {
		if (this.exemplares != null) {
			if (this.exemplares.getCodigo() == numero) {
				this.exemplares = proximo.exemplares;
				this.proximo = proximo.proximo;
			} else {
				proximo.remover(numero);
			}
		} else {
			throw new ExemplarNaoEncontradoException();
		}
	}

	public Exemplar procurar(int numero) throws ExemplarNaoEncontradoException {
		Exemplar resposta;
		if (this.exemplares != null) {
			if (this.exemplares.getCodigo() == numero) {
				resposta = this.exemplares;
			} else {
				resposta = proximo.procurar(numero);
			}
		} else {
			throw new ExemplarNaoEncontradoException();
			// resposta = null;
		}
		return resposta;
	}

	public boolean existe(int numero) {
		boolean resposta;
		if (this.exemplares != null) {
			if (this.exemplares.getCodigo() == numero) {
				resposta = true;
			} else {
				resposta = proximo.existe(numero);
			}
		} else {
			resposta = false;
		}
		return resposta;
	}

	public IteratorExemplares getIterator() {
		IteratorExemplaresArray resposta = new IteratorExemplaresArray();
		carregaIterator(resposta);
		return resposta;
	}
	
	private void carregaIterator(IteratorExemplaresArray iterator) {
		while (this.exemplares == null) {
			iterator.adicionar(proximo.exemplares);
			this.carregaIterator(iterator);
		}		
	}

}